Необходимые библиотеки:
library(dplyr)
library(ggplot2)
library(PerformanceAnalytics)
library(RColorBrewer)
library(corrplot)
library(Hmisc)
library(heatmaply)
Данные содержат некоторые индивидуальные характеристики студентов и результаты их успеваемости по курсу.
Переменные
gender (factor) - пол
| male | female | NA |
|---|---|---|
| мужской | женский | не указан |
number_pauses (int) - количество пауз, сделанных студентом в видеолекциях
Считываем данные
data <- read.csv("data.csv")
head(data)
Необходимо помнить два важных допущения для построения корреляции Пирсона:
Посмотрим, как распределены некоторые переменные с помощью диаграммы частот. И проверим нормальность распределения с помощью теста Шапиро-Уилка.
hist(data$grade, breaks = 20, col = "lightblue")
shapiro.test(data$grade)
##
## Shapiro-Wilk normality test
##
## data: data$grade
## W = 0.99704, p-value = 0.5028
Диаграмма показывает, что условие нормальности распределения выполняется. p-value = 0.5028, т.е. p-value > 0.05. Соответственно, гипотеза о нормальности распределения не отвергается.
hist(data$number_lectures, breaks = 20, col = "lightblue")
shapiro.test(data$number_lectures)
##
## Shapiro-Wilk normality test
##
## data: data$number_lectures
## W = 0.99344, p-value = 0.02855
Диаграмма показывает, что условие нормальности распределения не выполняется. p-value = 0.02855, т.е. p-value < 0.05. Соответственно, гипотеза о нормальности распределения отвергается.
hist(data$age, breaks = 20, col = "lightblue")
shapiro.test(data$age)
##
## Shapiro-Wilk normality test
##
## data: data$age
## W = 0.94904, p-value = 4.222e-12
Диаграмма показывает, что условие нормальности распределения не выполняется. p-value = 4.222e-12, т.е. p-value < 0.05. Соответственно, гипотеза о нормальности распределения отвергается.
Визуализация
Диаграмма рассеяния (scatterplot)
plot(data$number_lectures,
data$grade,
type = "p",
main = "A Scatterplot of X and Y",
xlab = "Количество просмотренных лекций",
ylab = "Оценка за курс",
col = "steelblue",
pch = 19)
ИЛИ
ggplot(data, aes(x = number_lectures, y = grade)) +
geom_point(color="#69b3a2") +
xlab("Количество просмотренных лекций") +
ylab("Оценка за курс")
Добавляем линию тренда
ggplot(data, aes(x = number_lectures, y = grade)) +
geom_point(color="#69b3a2") +
xlab("Количество просмотренных лекций") +
ylab("Оценка за курс") +
geom_smooth(method = lm, color = "red", se = FALSE)
## `geom_smooth()` using formula 'y ~ x'
Расчет коэффициента корреляции
В R коэффициент корреляции Пирсона можно легко рассчитать с помощью функциий cor() и cor.test(). Различие между данными функциями состоит в том, что cor() позволяет расчитать только коэффициент корреляции, а cor.test() помимо расчета самого коэффициента также выводит статистическую значимость коэффициента.
Функция cor(X, Y)
Функция cor.test(X, Y)
Поскольку в нашем случае не выполняется условие нормальности распределения для обеих переменных, необходимо использовать непараметрический коэффициент корреляции Спирмена. Для вычисления коэффициента корреляции Спирмена в R также используется функция cor.test(). Однако, по умолчанию данная функция расчитывает коэффициент корреляции Пирсона. Чтобы расчитать коэффициент корреляции Спирмена необходимо установить значение “spearman” в аргументе method:
cor.test(data$grade, data$number_lectures, method = "spearman")
## Warning in cor.test.default(data$grade, data$number_lectures, method =
## "spearman"): Cannot compute exact p-value with ties
##
## Spearman's rank correlation rho
##
## data: data$grade and data$number_lectures
## S = 3376789, p-value < 2.2e-16
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## 0.8379135
Коэффициент корреляции Спирмена равен 0.838, что указывает на сильную положительную корреляцию между количеством проссмотренных студентом лекций и его оценкой за курс.
cor.test(data$grade, data$age, method = "spearman")
## Warning in cor.test.default(data$grade, data$age, method = "spearman"): Cannot
## compute exact p-value with ties
##
## Spearman's rank correlation rho
##
## data: data$grade and data$age
## S = 20047661, p-value = 0.4001
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## 0.03770844
Коэффициент корреляции Спирмена равен 0.038, что указывает на достаточно слабую отрицательную корреляцию.
Визуализация
pairs( ~ age + grade + number_lectures + number_pauses, data = data,
main="Scatterplot Matrix")
Построение матрицы
data_1 <- data[,c(4,5,6,7,8)]
cor(data_1)
## age grade number_lectures
## age 1.00000000 0.04165184 0.01268095
## grade 0.04165184 1.00000000 0.85503913
## number_lectures 0.01268095 0.85503913 1.00000000
## number_supplement_materials 0.07547857 0.76242464 0.64320993
## number_forum_posts 0.02393370 0.71722348 0.62104083
## number_supplement_materials number_forum_posts
## age 0.07547857 0.0239337
## grade 0.76242464 0.7172235
## number_lectures 0.64320993 0.6210408
## number_supplement_materials 1.00000000 0.5593784
## number_forum_posts 0.55937840 1.0000000
Другие варианты визуализации
heatmaply_cor(
cor(data_1),
k_col = 2,
k_row = 2
)
## Warning in doTryCatch(return(expr), name, parentenv, handler): не могу загрузить разделяемый объект '/Library/Frameworks/R.framework/Resources/modules//R_X11.so':
## dlopen(/Library/Frameworks/R.framework/Resources/modules//R_X11.so, 6): Library not loaded: /opt/X11/lib/libSM.6.dylib
## Referenced from: /Library/Frameworks/R.framework/Versions/3.6/Resources/modules/R_X11.so
## Reason: image not found
data_2 <- cor(data_1, method = "spearman")
corrplot(data_2, method = "circle")
data_2 <- cor(data_1, method = "spearman")
corrplot(data_2, method = "number")
chart.Correlation(data_1, histogram=TRUE, pch=19)
Попробуйте построить рассчитать корреляцию между переменными
Выберете 2 заинтересовавшие Вас переменные
Постройте корреляцию (график и коэффициент)
Проинтерпретируйте результат
Отберите несколько заинтересовавших Вас переменных в новый датафрейм
Постройте корреляционную матрицу любым способом
Визуализируйте матрицу любыми 2-мя способами